home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1986, 1988 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement: ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
- #ifndef lint
- static char sccsid[] = "@(#)db_glue.c 4.4 (Berkeley) 6/1/90";
- #endif /* not lint */
-
- #include <sys/param.h>
- #include <sys/time.h>
- #include <sys/stat.h>
- #include <netinet/in.h>
- #include <stdio.h>
- #include <syslog.h>
- #include <ctype.h>
- #include <netdb.h>
- #include <arpa/nameser.h>
- #include "ns.h"
- #include "db.h"
-
- struct valuelist {
- struct valuelist *next, *prev;
- char *name;
- char *proto;
- short port;
- } *servicelist, *protolist;
-
- buildservicelist()
- {
- struct servent *sp;
- struct valuelist *slp;
-
- setservent(1);
- while (sp = getservent()) {
- slp = (struct valuelist *)malloc(sizeof(struct valuelist));
- slp->name = savestr(sp->s_name);
- slp->proto = savestr(sp->s_proto);
- slp->port = ntohs((u_short)sp->s_port);
- slp->next = servicelist;
- slp->prev = NULL;
- if (servicelist)
- servicelist->prev = slp;
- servicelist = slp;
- }
- endservent();
- }
-
- buildprotolist()
- {
- struct protoent *pp;
- struct valuelist *slp;
-
- setprotoent(1);
- while (pp = getprotoent()) {
- slp = (struct valuelist *)malloc(sizeof(struct valuelist));
- slp->name = savestr(pp->p_name);
- slp->port = pp->p_proto;
- slp->next = protolist;
- slp->prev = NULL;
- if (protolist)
- protolist->prev = slp;
- protolist = slp;
- }
- endprotoent();
- }
-
- /*
- * Convert service name or (ascii) number to int.
- */
- servicenumber(p)
- char *p;
- {
-
- return (findservice(p, &servicelist));
- }
-
- /*
- * Convert protocol name or (ascii) number to int.
- */
- protocolnumber(p)
- char *p;
- {
-
- return (findservice(p, &protolist));
- }
-
- findservice(s, list)
- register char *s;
- register struct valuelist **list;
- {
- register struct valuelist *lp = *list;
- int n;
-
- for (; lp != NULL; lp = lp->next)
- if (strcasecmp(lp->name, s) == 0) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- return(lp->port);
- }
- if (sscanf(s, "%d", &n) != 1 || n <= 0)
- n = -1;
- return(n);
- }
-
- struct servent *
- cgetservbyport(port, proto)
- u_short port;
- char *proto;
- {
- register struct valuelist **list = &servicelist;
- register struct valuelist *lp = *list;
- static struct servent serv;
-
- port = htons(port);
- for (; lp != NULL; lp = lp->next) {
- if (port != lp->port)
- continue;
- if (strcasecmp(lp->proto, proto) == 0) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- serv.s_name = lp->name;
- serv.s_port = htons((u_short)lp->port);
- serv.s_proto = lp->proto;
- return(&serv);
- }
- }
- return(0);
- }
-
- struct protoent *
- cgetprotobynumber(proto)
- register int proto;
- {
-
- register struct valuelist **list = &protolist;
- register struct valuelist *lp = *list;
- static struct protoent prot;
-
- for (; lp != NULL; lp = lp->next)
- if (lp->port == proto) {
- if (lp != *list) {
- lp->prev->next = lp->next;
- if (lp->next)
- lp->next->prev = lp->prev;
- (*list)->prev = lp;
- lp->next = *list;
- *list = lp;
- }
- prot.p_name = lp->name;
- prot.p_proto = lp->port;
- return(&prot);
- }
- return(0);
- }
-
- char *
- protocolname(num)
- int num;
- {
- static char number[8];
- struct protoent *pp;
-
- pp = cgetprotobynumber(num);
- if(pp == 0) {
- (void) sprintf(number, "%d", num);
- return(number);
- }
- return(pp->p_name);
- }
-
- char *
- servicename(port, proto)
- u_short port;
- char *proto;
- {
- static char number[8];
- struct servent *ss;
-
- ss = cgetservbyport(htons(port), proto);
- if(ss == 0) {
- (void) sprintf(number, "%d", port);
- return(number);
- }
- return(ss->s_name);
- }
-